package com.plian.system.controller.sys.region;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.plian.Tools.base.BaseController;
import com.plian.system.annotation.LogOperation;
import com.plian.system.entity.sys.Region;
import com.plian.system.model.R;
import com.plian.system.mybatis.support.Condition;
import com.plian.system.mybatis.support.Query;
import com.plian.system.node.ForestNodeMerger;
import com.plian.system.service.sys.region.IRegionService;
import com.plian.system.vo.sys.RegionVO;
import com.plian.system.wrapper.sys.RegionWrapper;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * @Author: Take-off
 * @Description: TODO
 * @Date: 2023/2/8 4:11 PM
 * @Version: 1.0
 **/
@RestController
@AllArgsConstructor
@RequestMapping("api/region")
@Api(value = "RegionController", tags = "行政区划 控制器")
public class RegionController extends BaseController {

    private final IRegionService regionService;

    private final RegionWrapper regionWrapper;

    /**
     * 详情
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "详情", notes = "传入region")
    public R<RegionVO> detail(Region region) {
        Region detail = regionService.getOne(Condition.getQueryWrapper(region));
        return R.data(regionWrapper.entityToVO(detail));
    }

    /**
     * 分页 行政区划表
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入region")
    public R<IPage<Region>> list(Region region, Query query) {
        IPage<Region> pages = regionService.page(Condition.getPage(query), Condition.getQueryWrapper(region));
        return R.data(pages);
    }


    /**
     * 懒加载列表
     */
    @GetMapping("/lazy-list")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "code", value = "区划编号", paramType = "query", dataType = "string"),
            @ApiImplicitParam(name = "name", value = "区划名称", paramType = "query", dataType = "string")
    })
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "懒加载列表", notes = "传入menu")
    public R<List<RegionVO>> lazyList(String parentCode, @ApiIgnore @RequestParam Map<String, Object> menu) {
        List<RegionVO> list = regionService.lazyList(parentCode, menu);
        return R.data(ForestNodeMerger.merge(list));
    }

    /**
     * 懒加载列表
     */
    @GetMapping("/lazy-tree")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "code", value = "区划编号", paramType = "query", dataType = "string"),
            @ApiImplicitParam(name = "name", value = "区划名称", paramType = "query", dataType = "string")
    })
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "懒加载列表", notes = "传入menu")
    public R<List<RegionVO>> lazyTree(String parentCode, @ApiIgnore @RequestParam Map<String, Object> menu) {
        List<RegionVO> list = regionService.lazyTree(parentCode, menu);
        return R.data(ForestNodeMerger.merge(list));
    }

    /**
     * 新增 行政区划表
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "新增", notes = "传入region")
    @LogOperation("行政区划-保存")
    public R save(@Valid @RequestBody Region region) {
        return R.status(regionService.save(region));
    }

    /**
     * 修改 行政区划表
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "修改", notes = "传入region")
    @LogOperation("行政区划-编辑")
    public R update(@Valid @RequestBody Region region) {
        return R.status(regionService.updateById(region));
    }

    /**
     * 新增或修改 行政区划表
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "新增或修改", notes = "传入region")
    @LogOperation("行政区划-提交")
    public R submit(@Valid @RequestBody Region region) {
        return R.status(regionService.submit(region));
    }


    /**
     * 删除 行政区划表
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 8)
    @ApiOperation(value = "删除", notes = "传入主键")
    @LogOperation("行政区划-删除")
    public R remove(@ApiParam(value = "主键", required = true) @RequestParam String id) {
        return R.status(regionService.removeRegion(id));
    }

    /**
     * 行政区划下拉数据源
     */
    @GetMapping("/select")
    @ApiOperationSupport(order = 9)
    @ApiOperation(value = "下拉数据源", notes = "传入tenant")
    public R<List<Region>> select(@RequestParam(required = false, defaultValue = "00") String code) {
        List<Region> list = regionService.list(Wrappers.<Region>query().lambda().eq(Region::getParentCode, code));
        return R.data(list);
    }
}
